/*
 *  xmp_facade.h
 *  Wilson
 *
 *  Created by Sebastian Orfino on 11/27/11.
 *  Copyright 2011 lbs3. All rights reserved.
 *
 */

#ifndef __XMPFACADE__
#define __XMPFACADE__

#include <vector>
#include <string>
#include "WilID.h"

namespace xmp {
	
	/** este es el esquema del item del bag wilson:nota en XMP */
	typedef struct {
		
		static inline const char * xmp_ns() { return kWilsonXMPNamespace; }
		
		/** El tag del bag que contiene las notas */
		static inline const char * bag_tag() { return "notas"; }
		static inline const char * tag() { return "nota"; }
		
		/** el tag del bag que contiene los comentarios */
		static inline const char * comentarios_tag() { return "comentarios"; };
		static inline const char * id_tag() { return "id"; };
		static inline const char * mini_tag()  { return "mini"; }
		static inline const char * creador_tag()  { return "creador"; }
		static inline const char * cuando_tag()  { return "timestamp"; }
		static inline const char * color_tag() { return "color"; }
		static inline const char * tiene_marcador_tag() { return "tienemarcador"; }
		
		std::string id; ///el id de la nota sale del IWilNoteData en el kWilNoteSplineBoss asociado.
		std::string mini; ///la mini se hace con el snapshot_helper
		std::string creador; ///el usuario IC que creo la nota
		std::string cuando; ///cuando
		std::string color_hex; ///el color en hexa de la nota (RGB).
		bool16 tiene_marcador; ///si es kTrue la nota tiene un PageItem (kWilNoteSplineBoss) asociado.
		
		//estas son otras que no se usan por ahora.
		float x,y,w,h; ///origen, alto y ancho coordenadas de la pagina del kWilNoteSplineBoss asociado (si tiene o cuando tenia)
		
		
	} info_nota_t;
	
	/** Esquema de un comentario. De esta forma esta guardado en XMP un nodo comentario*/
	typedef struct {
		
		static inline const char * xmp_ns() { return kWilsonXMPNamespace; }
		
		static inline const char * tag() { return "comentario"; }
		static inline const char * bag_tag() { return info_nota_t::comentarios_tag(); }
		
		static inline const char * id_tag() { return "id"; };
		static inline const char * id_nota_tag()  {return "id_nota"; }
		static inline const char * texto_tag()  { return  "texto"; }
		static inline const char * creador_tag()  { return "creador"; }
		static inline const char * cuando_tag()  { return "cuando"; }
		
		std::string id_nota; /// en que nota va este comentario
		std::string texto; ///el texto del comentario;
		std::string creador; ///quien lo hizo
		std::string cuando; ///cuando
		std::string id; /// el id del comentario. si esta vacio es que todavia no ha sido guardado.

		
		//estas son para implementar proximamente
		
		std::string id_avatar; ///que avatar usar para el comentario.
		std::string rgb_color_hex; ///el color del comentario de la forma #AF1B00
		
	} info_comentario_t;
	
	class wilson_metadata {
	
		UIDRef docRef;
	
	public:
		
		wilson_metadata(const UIDRef& doc);		
		/** crea una nota nueva en el documento docRef */
		void crear_nota( const info_nota_t& info);
		
		/** agregar el comentario a la nota info.id_nota. 
		 @param info al retornar si todo fue bien, en info.id viene el id del comentario.
		 */
		void agregar_comentario(info_comentario_t& info);
		
		/** lista las notas que hay guardadas en el documento */
		std::vector<info_nota_t> listar_notas() const;
		
		/** Lista los comentarios de la nota
		 @param in_nota solo se precisa el campo id
		 */
		std::vector<info_comentario_t> listar_comentarios(const info_nota_t& in_nota) const;
		
		/** Elimina la nota con in_nota.id y todos sus comentarios.
		 * @return kTrue si se pudo eliminar */
		bool16 eliminar_nota(const info_nota_t& in_nota) const;
		
		
		/** busca la nota in_nota.id y reemplaza los valores de esta entrada con los que vienen en in_nota */
		void modificar_nota(const info_nota_t& in_nota) const;
		
		void dump() const;
  };
}


#endif //__XMPFACADE__